using System;
using System.IO;
using UnityEngine;

public class FileOperator : IDisposable
{
    private string _filePath;

    public FileOperator(string fPath) //通过文件路径初始化对象
    {
        if (!File.Exists(fPath)) {
            Debug.LogError(fPath + "该文件不存在,请检查路径!");
            return;
        }
        _filePath = fPath;
    }

    
    
    /// <summary>
    /// 向文本文件的尾部追加内容
    /// </summary>
    /// <param name="content">写入的内容</param>
    public void AppendText(string content)
    {
        if (!File.Exists(_filePath)) {
            return;
        }
        File.AppendAllText(_filePath, content);
    }
    
    

    // 替换某些字符串
    public void ReplaceString(string oldStr, string newStr, string method = "") {
        if (!File.Exists(_filePath)) {
            return;
        }
        bool getMethod = false;
        string[] codes = File.ReadAllLines(_filePath);
        for (int i = 0; i < codes.Length; i++) {
            string str = codes[i].ToString();
            if (string.IsNullOrEmpty(method)) {
                if (str.Contains(oldStr)) codes.SetValue(newStr, i);
            }
            else {
                if (!getMethod) {
                    getMethod = str.Contains(method);
                }
                if (!getMethod) continue;
                if (str.Contains(oldStr)) {
                    codes.SetValue(newStr, i);
                    break;
                }
            }
        }
        File.WriteAllLines(_filePath, codes);
    }

    /**
     * TuanjieMainWorkerHandler.cs 新增import和消息监听代码
     */
    // 代码中添加import行内容
    public void InsertImports(string[] importLines) {
        if (!File.Exists(_filePath) || importLines.Length == 0) {
            return;
        }
        int lastImportLine = 0;
        string[] codes = File.ReadAllLines(_filePath);
        for (int i = 0; i < codes.Length; i++) {
            string str = codes[i];
            if (str.StartsWith("import")) continue;
            lastImportLine = i;
            break;
        }
        InsertAfterIndex(codes, lastImportLine, importLines);
    }

    /**
     * TuanjieMainWorkerHandler.cs 新增import和消息监听代码
     */
    // 代码中在指定行内容后面插入内容
    public void InsertAfterLineContent(string lineContent, string[] addLines) {
        if (!File.Exists(_filePath) || string.IsNullOrEmpty(lineContent)) {
            return;
        }
        int insertAfterIndex = 0;
        string[] codes = File.ReadAllLines(_filePath);
        for (int i = 0; i < codes.Length; i++) {
            string str = codes[i];
            if (str.Contains(lineContent)) {
                insertAfterIndex = i;
                break;
            }
        }
        InsertAfterIndex(codes, insertAfterIndex, addLines);
    }

    /**
     * TuanjieMainWorkerHandler.cs 新增import和消息监听代码
     */
    // 代码中在指定行号后面插入内容（行号从0开始）
    public void InsertAfterIndex(int insertAfterIndex, string[] contentLines) {
        if (!File.Exists(_filePath) || contentLines.Length == 0) {
            return;
        }
        string[] codes = File.ReadAllLines(_filePath);
        InsertAfterIndex(codes, insertAfterIndex, contentLines);
    }

    /**
     * TuanjieMainWorkerHandler.cs 新增import和消息监听代码
     */
    // 代码中在指定行号后面插入内容（行号从0开始）
    private void InsertAfterIndex(string[] codes, int insertAfterIndex, string[] contentLines) {
        int newCodesLineCount = codes.Length + contentLines.Length;
        string[] newCodes = new string[newCodesLineCount];
        for (int i = newCodesLineCount - 1; i >= 0; i--) {
            if (i > insertAfterIndex + contentLines.Length) {
                newCodes[i] = codes[i - contentLines.Length];
                continue;
            }
            if (i > insertAfterIndex) {
                newCodes[i] = contentLines[i - insertAfterIndex - 1];
                continue;
            }
            newCodes[i] = codes[i];
        }
        File.WriteAllLines(_filePath, newCodes);
    }

    /**
     * TuanjieMainWorkerHandler.cs 新增import和消息监听代码
     */
    // 代码中在指定行内容后面插入内容
    public void InsertBeforeLineContent(string lineContent, string[] addLines) {
        if (!File.Exists(_filePath) || string.IsNullOrEmpty(lineContent)) {
            return;
        }
        int insertBeforeIndex = 0;
        string[] codes = File.ReadAllLines(_filePath);
        for (int i = 0; i < codes.Length; i++) {
            string str = codes[i];
            if (str.Contains(lineContent)) {
                insertBeforeIndex = i;
                break;
            }
        }
        InsertBeforeIndex(codes, insertBeforeIndex, addLines);
    }

    /**
     * TuanjieMainWorkerHandler.cs 新增import和消息监听代码
     */
    // 代码中在指定行号前面插入内容（行号从0开始）
    private void InsertBeforeIndex(string[] codes, int insertBeforeIndex, string[] contentLines) {
        int newCodesLineCount = codes.Length + contentLines.Length;
        string[] newCodes = new string[newCodesLineCount];
        for (int i = newCodesLineCount - 1; i >= 0; i--) {
            if (i >= insertBeforeIndex + contentLines.Length) {
                newCodes[i] = codes[i - contentLines.Length];
                continue;
            }
            if (i > insertBeforeIndex - 1) {
                newCodes[i] = contentLines[i - insertBeforeIndex];
                continue;
            }
            newCodes[i] = codes[i];
        }
        File.WriteAllLines(_filePath, newCodes);
    }
    
    public void Dispose() {
    }

    public static void MoveDirectory(string oldPath, string newPath) {
        if (Directory.Exists(oldPath) && !Directory.Exists(newPath)) {
            DirectoryInfo diInfo = new DirectoryInfo(oldPath);
            diInfo.MoveTo(newPath);
            return;
        }
        Directory.Delete(oldPath,true);
    }

    /// <summary>
    /// 修改文件类型
    /// </summary>
    /// <param name="oldFileName">原文件名</param>
    /// <param name="newExtension">修改后的文件类型</param>
    public static void ChangeFileExtension(string oldFileName, string newExtension)
    {
        string originalFilePath = oldFileName; // 原始文件路径  
        string newFilePath = Path.ChangeExtension(originalFilePath, newExtension); // 新文件路径，包括新的扩展名  
  
        // 检查文件是否存在  
        if (File.Exists(originalFilePath))  
        {  
            // 重命名文件  
            File.Move(originalFilePath, newFilePath);  
        } 
    }

    /// <summary>
    /// 删除文件
    /// </summary>
    /// <param name="filePath">文件路径</param>
    public static void DeleteFile(string filePath)
    {
        // 检查文件是否存在  
        if (File.Exists(filePath))  
        {  
            try  
            {  
                // 删除文件  
                File.Delete(filePath);  
            }  
            catch (Exception ex)  
            {  
                // 处理异常  
                Debug.Log("删除文件时发生错误: " + ex.Message);  
            }  
        }  
        else  
        {  
            Debug.Log("文件不存在。");  
        }  
    }
}